package com.silence.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyUtil {
    // 相当于中介公司
    public static Star createProxy(BigStar bigStar) {
        /*
            parameters:
            ClassLoader loader,
            Class<?>[] interfaces,
            InvocationHandler h
            参数1：用于指定一个类加载器
            参数2：指定生成的代理长什么样子，也就是有哪些方法
            参数3：指定生成的代理对象要干什么事情，new一个接口的匿名内部类对象
         */
        return (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},
                new InvocationHandler() {
                    @Override // 回调方法，
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 对象要做的事情，在这里写代码
                        if (method.getName().equals("sing")) {
                            System.out.println("准备话筒，收钱");
                        } else if (method.getName().equals("dance")) {
                            System.out.println("准备场地，收钱");
                        }
                        // args 是 method 的参数，不论有参无参
                        return method.invoke(bigStar, args);
                    }
                } );
    }
}
